TCP Socket Programming হলো TCP (Transmission Control Protocol) প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে নির্ভরযোগ্য সংযোগ এবং ডেটা ট্রান্সফার স্থাপন করার একটি পদ্ধতি। TCP একটি কানেকশন-অরিয়েন্টেড প্রোটোকল, যা নির্ভরযোগ্য এবং অর্ডারড ডেটা ট্রান্সমিশন নিশ্চিত করে। TCP Socket Programming ক্লায়েন্ট এবং সার্ভার মডেলে কাজ করে, যেখানে সার্ভার একটি নির্দিষ্ট পোর্টে সংযোগের জন্য অপেক্ষা করে এবং ক্লায়েন্ট সেই সার্ভারের সাথে সংযোগ স্থাপন করে ডেটা আদান-প্রদান করে।
TCP Socket Programming-এর মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে সফলভাবে যোগাযোগ স্থাপন করার জন্য কয়েকটি System Call এবং ফাংশন ব্যবহার করা হয়। নিচে প্রতিটি System Call এবং তাদের ভূমিকা ব্যাখ্যা করা হয়েছে:
socket():
int socket(int domain, int type, int protocol);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
bind() (সার্ভারের ক্ষেত্রে):
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen() (সার্ভারের ক্ষেত্রে):
int listen(int sockfd, int backlog);
listen(sockfd, 5);
accept() (সার্ভারের ক্ষেত্রে):
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int new_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addr_size);
connect() (ক্লায়েন্টের ক্ষেত্রে):
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
send() এবং recv():
send()
ফাংশন ডেটা পাঠানোর জন্য এবং recv()
ফাংশন ডেটা গ্রহণ করার জন্য ব্যবহৃত হয়।ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
close():
Syntax: int close(int sockfd);
TCP (Transmission Control Protocol) হলো একটি কানেকশন-অরিয়েন্টেড প্রোটোকল, যা ইন্টারনেট বা অন্য কোনো নেটওয়ার্কে নির্ভরযোগ্য এবং অর্ডার মেইনটেনিং ডেটা ট্রান্সফার নিশ্চিত করে। এটি ইন্টারনেট প্রোটোকল স্যুটের অন্যতম প্রধান প্রোটোকল এবং TCP/IP স্ট্যাকের Transport Layer-এ কাজ করে। TCP মূলত ক্লায়েন্ট এবং সার্ভারের মধ্যে নির্ভরযোগ্য যোগাযোগ স্থাপন করে এবং ডেটা প্যাকেটগুলোকে সঠিক ক্রমানুসারে পৌঁছে দেয়।
TCP-এর কিছু গুরুত্বপূর্ণ বৈশিষ্ট্য নিচে উল্লেখ করা হলো:
TCP-এর কাজের পদ্ধতিটি প্রধানত তিনটি ধাপে বিভক্ত: সংযোগ স্থাপন (Connection Establishment), ডেটা ট্রান্সফার (Data Transfer), এবং সংযোগ বন্ধ করা (Connection Termination)।
TCP সংযোগ স্থাপন করার সময় একটি Three-Way Handshake প্রক্রিয়া অনুসরণ করে। এতে তিনটি ধাপ থাকে:
এই প্রক্রিয়া সম্পন্ন হলে, ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থায়ী সংযোগ তৈরি হয় এবং তারা ডেটা ট্রান্সফারের জন্য প্রস্তুত থাকে।
TCP ডেটা প্যাকেটগুলোকে ছোট ছোট সেগমেন্টে ভাগ করে এবং সেগুলোকে সঠিক ক্রমানুসারে ট্রান্সমিট করে। প্রতিটি সেগমেন্টে একটি চেকসাম এবং সিকোয়েন্স নম্বর থাকে, যা ত্রুটি শনাক্তকরণ এবং সঠিক ক্রম নিশ্চিত করে।
TCP সংযোগ বন্ধ করতে Four-Way Handshake পদ্ধতি অনুসরণ করে:
TCP বিভিন্ন নেটওয়ার্ক ভিত্তিক অ্যাপ্লিকেশন এবং পরিষেবায় ব্যবহৃত হয়, যেমন:
TCP এবং UDP (User Datagram Protocol) উভয়ই Transport Layer প্রোটোকল, তবে এদের মধ্যে কয়েকটি গুরুত্বপূর্ণ পার্থক্য রয়েছে:
বৈশিষ্ট্য | TCP | UDP |
---|---|---|
প্রোটোকল ধরণ | Connection-oriented | Connectionless |
নির্ভরযোগ্যতা | নির্ভরযোগ্য (Reliable) | নির্ভরযোগ্য নয় (Unreliable) |
ডেটা অর্ডার | অর্ডার মেইনটেন করে | অর্ডার মেইনটেন করে না |
ফ্লো কন্ট্রোল | ফ্লো কন্ট্রোল ব্যবহার করে | ফ্লো কন্ট্রোল ব্যবহার করে না |
উদাহরণ | HTTP, FTP, SMTP, SSH | DNS, DHCP, VoIP, Online Gaming |
স্পিড | তুলনামূলকভাবে ধীর (নির্ভরযোগ্যতার জন্য) | দ্রুত (কানেকশনলেস) |
TCP (Transmission Control Protocol) একটি Three-Way Handshake প্রক্রিয়ার মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ স্থাপন করে। এটি একটি কানেকশন-অরিয়েন্টেড প্রোটোকল, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে নির্ভরযোগ্য যোগাযোগ স্থাপন করতে এবং ডেটা ট্রান্সফার শুরু করার আগে উভয় পক্ষের মধ্যে সমঝোতা নিশ্চিত করতে ব্যবহৃত হয়। Three-Way Handshake একটি স্থায়ী এবং নির্ভরযোগ্য সংযোগ তৈরি করার জন্য তিনটি ধাপে সম্পন্ন হয়।
Three-Way Handshake প্রক্রিয়াটি তিনটি প্রধান ধাপের মাধ্যমে সম্পন্ন হয়:
উদাহরণ:
X
।(X+1)
পাঠায়, যা নির্দেশ করে যে ক্লায়েন্টের SYN প্যাকেটটি সফলভাবে গ্রহণ করা হয়েছে।উদাহরণ:
Y
এবং ক্লায়েন্টের ACK হিসাবে (X+1)
।(Y+1)
পাঠায়, যা নিশ্চিত করে যে সার্ভারের SYN-ACK প্যাকেট সফলভাবে গ্রহণ করা হয়েছে।উদাহরণ:
(Y+1)
।ধাপ | প্রেরক | প্রাপক | প্যাকেটের ধরন | Sequence/ACK Number |
---|---|---|---|---|
১ | ক্লায়েন্ট | সার্ভার | SYN | Sequence Number: X |
২ | সার্ভার | ক্লায়েন্ট | SYN-ACK | Sequence Number: Y , ACK: X+1 |
৩ | ক্লায়েন্ট | সার্ভার | ACK | ACK: Y+1 |
নিচে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে TCP Three-Way Handshake প্রক্রিয়ার মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ স্থাপন করা হয়:
ধাপ ১: ক্লায়েন্ট একটি SYN প্যাকেট পাঠায়:
1000
।ধাপ ২: সার্ভার একটি SYN-ACK প্যাকেট পাঠায়:
1001
পাঠায় এবং নিজস্ব Sequence Number 2000
পাঠায়।ধাপ ৩: ক্লায়েন্ট একটি ACK প্যাকেট পাঠায়:
2001
পাঠায়।এই প্রক্রিয়া সম্পন্ন হওয়ার পর, ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থায়ী সংযোগ তৈরি হয় এবং ডেটা ট্রান্সফারের জন্য তারা প্রস্তুত থাকে।
TCP Server এবং Client-এর উদাহরণ দেখানোর জন্য আমরা C ভাষায় একটি সহজ প্রোগ্রাম তৈরি করবো, যেখানে সার্ভার একটি নির্দিষ্ট পোর্টে অপেক্ষা করবে এবং ক্লায়েন্ট সেই পোর্টে সংযোগ স্থাপন করে ডেটা পাঠাবে ও গ্রহণ করবে।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
// 1. Socket তৈরি করা
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. সার্ভার ঠিকানা সেটআপ করা
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 3. Binding করা
if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
// 4. Listening করা
if (listen(server_fd, 3) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
printf("Server is listening on port %d\n", PORT);
// 5. Accepting সংযোগ
if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
// 6. ডেটা গ্রহণ করা
read(new_socket, buffer, 1024);
printf("Client: %s\n", buffer);
// 7. ডেটা পাঠানো
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent to client\n");
// 8. Socket বন্ধ করা
close(new_socket);
close(server_fd);
return 0;
}
TCP Client প্রোগ্রাম উদাহরণ (C ভাষায়)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char *hello = "Hello from client";
char buffer[1024] = {0};
// 1. Socket তৈরি করা
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Socket creation failed\n");
return -1;
}
// 2. সার্ভার ঠিকানা সেটআপ করা
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 3. IP Address সেট করা
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
printf("Invalid address or Address not supported\n");
return -1;
}
// 4. সার্ভারের সাথে সংযোগ স্থাপন করা
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
printf("Connection Failed\n");
return -1;
}
// 5. ডেটা পাঠানো
send(sock, hello, strlen(hello), 0);
printf("Hello message sent to server\n");
// 6. ডেটা গ্রহণ করা
read(sock, buffer, 1024);
printf("Server: %s\n", buffer);
// 7. Socket বন্ধ করা
close(sock);
return 0;
}
প্রোগ্রাম বিশ্লেষণ
Socket তৈরি:
socket()
ফাংশন ব্যবহার করে TCP প্রোটোকল ব্যবহার করে সার্ভারের জন্য একটি Socket তৈরি করা হয়।Binding:
bind()
ফাংশন সার্ভারের Socket-কে নির্দিষ্ট IP Address (INADDR_ANY
, যা সমস্ত নেটওয়ার্ক ইন্টারফেস নির্দেশ করে) এবং পোর্ট (8080
) এর সাথে সংযুক্ত করে।Listening:
listen()
ফাংশন সার্ভারের Socket-কে ইনকামিং সংযোগ গ্রহণের জন্য অপেক্ষমাণ রাখে।Accepting সংযোগ:
accept()
ফাংশন একটি ইনকামিং সংযোগ গ্রহণ করে এবং নতুন Socket তৈরি করে, যা ক্লায়েন্টের সাথে ডেটা ট্রান্সফার করতে ব্যবহৃত হয়।ডেটা গ্রহণ এবং পাঠানো:
read()
ফাংশন ব্যবহার করে ক্লায়েন্ট থেকে ডেটা গ্রহণ করা হয়, এবং send()
ফাংশন ব্যবহার করে ক্লায়েন্টে ডেটা পাঠানো হয়।Socket বন্ধ করা:
close()
ফাংশন ব্যবহার করে নতুন Socket এবং সার্ভার Socket বন্ধ করা হয়।Socket তৈরি:
socket()
ফাংশন ব্যবহার করে TCP প্রোটোকল ব্যবহার করে ক্লায়েন্টের জন্য একটি Socket তৈরি করা হয়।সার্ভারের ঠিকানা সেটআপ:
inet_pton()
ফাংশন সার্ভারের IP Address (127.0.0.1
, যা localhost নির্দেশ করে) এবং পোর্ট (8080
) সেট করে।সার্ভারের সাথে সংযোগ স্থাপন:
connect()
ফাংশন ব্যবহার করে ক্লায়েন্ট সার্ভারের সাথে সংযোগ স্থাপন করে।ডেটা পাঠানো এবং গ্রহণ:
send()
ফাংশন ব্যবহার করে সার্ভারে ডেটা পাঠানো হয় এবং read()
ফাংশন ব্যবহার করে সার্ভার থেকে ডেটা গ্রহণ করা হয়।Socket বন্ধ করা:
close()
ফাংশন ব্যবহার করে ক্লায়েন্টের Socket বন্ধ করা হয়।প্রথমে সার্ভার প্রোগ্রাম চালু করুন:
8080
) এ ইনকামিং সংযোগের জন্য অপেক্ষা করবে।এরপর ক্লায়েন্ট প্রোগ্রাম চালু করুন:
ক্লায়েন্ট এবং সার্ভারের মধ্যে বার্তা আদান-প্রদান:
TCP (Transmission Control Protocol) একটি নির্ভরযোগ্য কানেকশন-অরিয়েন্টেড প্রোটোকল, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা ট্রান্সমিশন এবং সংযোগ বন্ধের (Connection Termination) জন্য নির্দিষ্ট প্রক্রিয়া অনুসরণ করে। TCP ডেটা প্যাকেট ট্রান্সমিশন এবং সংযোগ টার্মিনেশনের মাধ্যমে সংযোগ স্থায়ী ও কার্যকর রাখতে সহায়ক।
TCP-তে ডেটা ট্রান্সফার করার সময় ডেটা প্যাকেটগুলোকে সঠিকভাবে ট্রান্সমিট এবং রিসিভ করা হয়। TCP ডেটা ট্রান্সমিশনের সময় নিচের কয়েকটি ধাপ অনুসরণ করে:
ডেটা প্যাকেট বিভাজন (Segmentation):
Sequence Number এবং Acknowledgment:
Error Detection এবং Retransmission:
Congestion Control এবং Flow Control:
ধরা যাক, ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা ট্রান্সমিশন হচ্ছে:
1001
।1002
থাকে।TCP একটি Four-Way Handshake পদ্ধতি ব্যবহার করে সংযোগ বন্ধ করে। এটি সংযোগ স্থাপন করার মতোই একটি প্রক্রিয়া, যা ক্লায়েন্ট এবং সার্ভার উভয়ের মধ্যে সম্মতিপূর্ণ সংযোগ সমাপ্তি নিশ্চিত করে।
ধরা যাক, ক্লায়েন্ট সংযোগ বন্ধ করতে চায়:
common.read_more